範圍鍊:
函式內的變數若有自己的值,就會用自己的。
若是函式內的變數找不到值,就會往外一層函式查找,
直到全域環境有找到或是沒找到 (undefined)。
範圍鍊是依據函式文法本身來決定,與執行環境無關
當 fn2() 內的 a 在自己這層找不到時,就會往上一層 fn1() 找到 a 並使用它的值
fn2() 內的 b,自己就有宣告 b 值,所以就用自己的
fn2() 內的 c,自己找不到,往上一層 fn1()也沒有,最後找到全域的 c 並套用
範例:把上圖的狀況轉換成字長版本
var person = '老媽'
function sayHi() {
  console.log('hi ' + person);
}
function doMorningWork() {
  var person = '老爸';
  function meetAuntie() {
    var person = '漂亮阿姨';
    console.log('哈囉~ ' + person);
  }
  meetAuntie();
}
sayHi();
doMorningWork();
當我們執行sayHi() 時,person會指向全域的老媽,因為sayHi()本身沒有person這個變數
執行 doMorningWork() 時,繼續會執行內一層的meetAuntie(),此時 meetAuntie()的person 會指向 '漂亮阿姨',因為自己本身就有宣告這個變數
同上一個情境,若meetAuntie() 沒有宣告 person ,此時 person就會指向外面一層的 '老爸',再若是沒有找到,最後就會指向全域宣告的 person = '老媽'